package com.estun.backroundManagementService.utils;

import com.estun.backroundManagementService.domain.BaseResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @author yusiocng
 * @date 2023/8/11
 * @description 文件工具类
 */
@Slf4j
public class FileUtil {
    public static final String systemPath = System.getProperty("user.dir") + File.separator;
    public static final String basePath = "uploadFile" + File.separator;
    public static final String savePath = systemPath + basePath;
    /**
     * 软件存储路径
     */
    public static final String stwarePaht = basePath + "stware" + File.separator;
    public static final String workPaperPath = basePath + "workPaperFile" + File.separator;
    public static final String sopPath = basePath + "workPaperFile" + File.separator;

    public static Boolean moveFile(String sourcePath, String targetPath) {
        log.info("源文件路径：" + sourcePath);
        log.info("目标文件路径：" + targetPath);

        Path source = Paths.get(sourcePath);
        Path target = Paths.get(targetPath);

        // 确保目标路径的父文件夹存在，如果不存在则创建
        File targetDirectory = target.getParent().toFile();
        if (!targetDirectory.exists()) {
            boolean created = targetDirectory.mkdirs();
            if (!created) {
                log.error("无法创建目标文件夹！");
                return false;
            }
        }
        try {
            // 将源文件移动到目标路径
            try {
                Files.move(source, target);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    public static String addVersionSuffix(String filename, String version) {
        int dotIndex = filename.lastIndexOf('.');
        if (dotIndex != -1) {
            String nameWithoutExtension = filename.substring(0, dotIndex);
            String extension = filename.substring(dotIndex);
            return nameWithoutExtension + "_" + version + extension;
        } else {
            return null;
        }
    }

    /**
     * 保存文件到指定目录
     */
    public static String saveFile(MultipartFile file, String path) throws IOException {
        if (file.isEmpty()) {
            log.error("文件为空！");
            throw new IOException("文件为空！");
        }

        // 获取文件名
        String fileName = StringUtils.cleanPath(Objects.requireNonNull(file.getOriginalFilename()));

        // 构建文件保存路径
        String targetPath = systemPath + path;
        File targetDirectory = new File(targetPath);

        if (!targetDirectory.exists()) {
            if (targetDirectory.mkdirs()) {
                log.info("文件夹创建成功: " + targetPath);
            } else {
                log.error("无法创建文件夹: " + targetPath);
                throw new IOException("无法创建文件夹: " + targetPath);
            }
        }

        // 保存文件到指定路径
        File targetFile = new File(targetPath, fileName);
        file.transferTo(targetFile);

        log.info("文件上传成功");
        return path + fileName;
    }


    public static Boolean moveToHis(String sourcePath, String targetPath) {
        //targetFilePath 在文件类型前增加时间戳后缀 例如 sadwasd.mp4 -> sadwasd_2020-12-12_12-12-12.mp4
        if (FileUtil.moveFile(systemPath + sourcePath, systemPath + targetPath)) {
            return true;
        } else {
            log.error("文件移动失败sourcePath:{},targetPath:{}", sourcePath, targetPath);
            return null;
        }
    }

    public static String modifyHisPath(String originalPath) {
        int lastIndex = originalPath.lastIndexOf('/');
        if (lastIndex >= 0) {
            String newPath = originalPath.substring(0, lastIndex) + "/his" + originalPath.substring(lastIndex);
            return newPath;
        }
        return originalPath;
    }


    /**
     * 获取文件夹中所有文件
     *
     * @param dirPath 检测文件夹路径
     * @return 文件List
     */
    public static List<File> getAllFileInDir(String dirPath) {
        List<File> fileList = new ArrayList<>();
        File directory = new File(dirPath);
        // 检查文件夹是否存在
        if (directory.exists() && directory.isDirectory()) {
            // 获取文件夹中的所有文件和子文件夹
            File[] files = directory.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isFile()) {
                        // 如果是文件，将文件的绝对路径添加到列表中
                        fileList.add(file);
                    } else if (file.isDirectory()) {
                        // 如果是子文件夹，递归调用该方法来获取子文件夹中的文件路径
                        List<File> subFolderFiles = getAllFileInDir(file.getAbsolutePath());
                        fileList.addAll(subFolderFiles);
                    }
                }
            }
        } else {
            log.error("指定的路径不是文件夹或文件夹不存在: {}", dirPath);
        }
        return fileList;
    }

    /**
     * 从路径中截取文件名
     *
     * @param filePath 文件路径
     * @return 文件名
     */
    public static String getFileNameFromPath(String filePath) {
        int lastSeparatorIndex = filePath.lastIndexOf("/");
        if (lastSeparatorIndex == -1) {
            lastSeparatorIndex = filePath.lastIndexOf("\\");
        }
        return filePath.substring(lastSeparatorIndex + 1);
    }

    /**
     * 程序下发到指定文件夹
     *
     * @param fileList   .S .P文件列表
     * @param fileDir    目标文件夹
     * @param stwareName 程序名称
     * @param bmsUrl     bmsUrl
     * @return 下发结果
     */
    public static BaseResponse doIssue(List<String> fileList, String fileDir, String stwareName, String bmsUrl) {
        for (String path : fileList) {
            if (!path.contains(".S") && !path.contains(".P")) {
                //剔除非.S .P文件
                continue;
            }
            // 拼接完整文件路径
            // 使用 Paths 获取文件名部分
            Path filePath = Paths.get(path);
            log.info("下发路径:{}", filePath);
            String fileName = filePath.getFileName().toString();
            int dotIndex = fileName.lastIndexOf(".");
            if (dotIndex != -1) {
                fileName = stwareName + fileName.substring(dotIndex);
            }
            // 拼接完整文件路径
            String completeFilePath = fileDir + File.separator + fileName;
            // 使用Apache Commons IO库来进行文件的复制操作
            try {
                String remotePath = bmsUrl + path;
                log.info("程序文件下载：远程地址:{}，本地地址:{}", remotePath, completeFilePath);
                FileUtils.copyURLToFile(new URL(remotePath), new File(completeFilePath));
                // 或者使用其他下载方法，根据你的需求来选择
            } catch (IOException e) {
                log.error(e.getMessage());
                // 处理下载文件时可能出现的异常
                return BaseResponse.error("文件下载失败");
            }
        }
        return BaseResponse.success();
    }
}
